package com.ruoyi.partybuilding.common;


import com.ruoyi.common.core.domain.entity.SysDictData;
import com.ruoyi.common.core.domain.entity.SysDictType;
import javafx.util.Pair;
import lombok.var;
import org.springframework.context.annotation.Description;

import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlEnumValue;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class DictPB {
    static final String indexValueSign="index";
    public static final String type_prefix="pb_";
    static SysDictData dictCreate(String label, String value) {
        var data = new SysDictData();
        data.setDictLabel(label);
        data.setDictValue(value);
        return data;
    }

    static SysDictType typeCreate(String label, String value) {
        var type = new SysDictType();
        type.setDictName(label);
        type.setDictType(value);
        return type;
    }
    interface EnumIntValue {
        default int getValue() {
            return ((Enum) this).ordinal();
        }
    }
    @Description("组织类型")
    public enum org_type implements EnumIntValue{
        党委,
        党总支部,
        党支部,
        联合党支部,
        临时党支部;
    }

    @Description("换届形式")
    public enum team_trans_way implements EnumIntValue{
        党员大会,
        党代表大会
    }

    @Description("班子职务")
    public enum team_duty implements EnumIntValue{
        党委书记,
        党工委书记,
        党委副书记,
        党工委副书记,
        纪委书记,
        党委常委,
        党委委员,
        党工委委员,
        党委候补委员
    }
    @Description("任职方式")
    public enum  team_appointment implements EnumIntValue{
        上级任命,
        选举,
        新录用公务员试用期满经考核合格的,
        挂职,
        其他;
    }
    @Description("任职年限")
    public enum  team_appointment_years implements EnumIntValue{
        三年(3),
        五年(5);

        team_appointment_years(int val)
        {
            value=val;
        }
        int value;
        @Override
        public int getValue() {
            return value;
        }
    }

    @Description("会议类型")
    public enum  meeting_type implements EnumIntValue {
        /**
         * 1、会议时间：每季度召开一次，会议由党支部书记主持，书记不在时由副书记主持。
         * 2、与会人员：会议由全体党员参加，根据内容的需要，有时可吸收非党干部或入党积极分子列席参加。
         * 3、会议内容
         * （1）传达学习党的路线、方针、政策和上级党组织的决议、指示，制定党支部贯彻落实的计划、措施。
         * （2）定期听取、讨论支部委员会的工作报告，对支部委员会的工作进行审查和监督。
         * （3）讨论发展新党员和接收预备党员转正，讨论决定对党员的表彰和处分。
         * （4）选举支部委员会成员和出席上级党代会的代表。
         * （5）讨论需由支部大会决定的其它重要事项。
         * 4、会议形成的决议由支委会负责检查落实。
         * 5、会议记录：支部组织委员负责会议记录，会议记录要认真保管，年终归档备查。
         */
        党支部党员大会(0),
        /**
         * 支部委员会的会议每月一次
         */
        支部委员会(1),
        /**
         * 党小组会每月至少召开一次
         */
        党小组会(2),
        /** 党课每季度一次
         *
         */
        党课(3),
        组织生活会(4),
        民主生活会(5),
        民主评议党员(6),
        其他(7);

        meeting_type(int val)
        {
            value=val;
        }
        final int value;
        @Override
        public int getValue() {
            return value;
        }
    }

    @Description("会议议题")
    public enum  meeting_topic implements EnumIntValue {
        党员推优,
        党员发展,
        党员处分,
        其他;
    }
    @XmlAttribute(name="工作岗位")
    public static String pb_member_job="其他从业人员|党组织关系在人才（劳动）服务中心，不明职业的人员|（转业）待安置、学生毕业未就业人员|自由职业人员|个体工商户中的从业人员|停薪留职人员|社区工作人员|大学生村官|内部退养职工|退职人员|退休人员|离退休干部|技工学校学生|高中学生|中等专业学校学生|大学专科其他年级学生|大学专科一年级学生|大学专科毕业年级学生|大学本科其他年级学生|大学本科一年级学生|大学本科毕业年级学生|研究生其他年级学生|研究生一年级学生|研究生毕业年级学生|其他农牧渔民|外出务工经商人员|乡村医生|农牧渔业生产人员|事业单位工勤岗位|机关单位工勤岗位|民办非企业工勤岗位|非公有企业工勤岗位|公有制经济控制单位工勤岗位|民办非企业专业技术岗位|民办非企业管理岗位|非公有经济控制企业专业技术岗位|非公有经济控制企业管理岗位|公有经济控制企业专业技术岗位|公有经济控制企业管理岗位|事业单位专业技术岗位|事业单位管理岗位|参照公务员法管理的工作人员|公务员|解放军，武警";
    @XmlAttribute(name="学历")
    public static String pb_member_education="技工学校|职业高中|中等专科|省（区、市）委党校大专|中央党校大专|省（区、市）委党校大学|中央党校大学|第二学士学位班|大学普通班|大专|大学|省（区、市）委党校研究生|中央党校研究生|硕士生班|硕士研究生|博士研究生|其他|小学|初中|普通高中";
    @XmlAttribute(name = "民族")
    public static String pb_member_nation="汉族|蒙古族|回族|藏族|维吾尔族|苗族|彝族|壮族|布依族|朝鲜族|满族|侗族|瑶族|白族|土家族|哈尼族|哈萨克族|傣族|黎族|傈僳族|佤族|畲族|高山族|拉祜族|水族|东乡族|纳西族|景颇族|柯尔克孜族|土族|达斡尔族|仫佬族|羌族|布朗族|撒拉族|毛南族|仡佬族|锡伯族|阿昌族|普米族|塔吉克族|怒族|乌孜别克族|俄罗斯族|鄂温克族|德昂族|保安族|裕固族|京族|塔塔尔族|独龙族|鄂伦春族|赫哲族|门巴族|珞巴族|基诺族|其他族|外国血统|外国民族";

    @XmlAttribute(name = "个人奖惩",namespace = indexValueSign)
    public static  String pb_member_reward="全国优秀党员|部、委级优秀党员|省（区、市）级优秀党员|地（市、州）级优秀党员|县（市、区）级优秀党员|系统表彰优秀党员|（其他）优秀党员|基层优秀党员|全国优秀党务工作者|部、委级优秀党务工作者|省（区、市）级优秀党务工作者|地（市、州）级优秀党务工作者|县（市、区）级优秀党务工作者|系统表彰优秀党务工作者|（其他）优秀党务工作者|基层优秀党务工作者|全国先进个人|部、委级先进个人|省（区、市）级先进个人|地（市、州）级先进个人|县（市、区）级先进个人|系统表彰先进个人|（其他）先进个人|基层先进个人";
    public static  String pb_member_reward2="警告|严重警告|撤销党内职务|留党查看|开除党籍|记过";

    @XmlAttribute(name = "组织奖惩",namespace = indexValueSign)
    public static String pb_org_reward ="全国先进党组织|部、委级先进党组织|省（区、市）级先进党组织|地（市、州）级先进党组织|县（市、区）级先进党组织|本系统级先进党组织|（其他）先进党组织|基层先进党组织";
    public static String pb_org_reward2="改组|解散";
    public static Pair<SysDictType, SysDictData[]>[] strDictOut() {
        var list = Arrays.stream(DictPB.class.getFields()).filter(p -> Modifier.isStatic(p.getModifiers()) && p.getAnnotation(XmlAttribute.class) != null).collect(Collectors.toList());
        var re = list.stream().map(p -> {
            var dictType = new SysDictType();
            dictType.setDictName(p.getAnnotation(XmlAttribute.class).name());
            dictType.setDictType(p.getName());
            SysDictData[] data = null;
            try {
                var val = (String) p.get(null);
                var items = val.split("\\|");
                data = Arrays.stream(items).map(x -> {
                    var dc = new SysDictData();
                    dc.setDictType(dictType.getDictType());
                    dc.setDictLabel(x);
                    dc.setDictValue(x);
                    return dc;
                }).toArray(SysDictData[]::new);
            } catch (IllegalAccessException e) {
                throw new RuntimeException(e);
            }
            if (indexValueSign.equals(p.getAnnotation(XmlAttribute.class).namespace()))
                for (int i = 0; i < data.length; i++)
                    data[i].setDictValue(i + "");
            return new Pair(dictType, data);
        }).toArray(Pair[]::new);
        return re;
    }
    public static Pair<SysDictType, SysDictData[]>[]  outDict() {
        var inners = DictPB.class.getDeclaredClasses();
        var list = Arrays.stream(inners).filter(p -> Modifier.isStatic(p.getModifiers())&&p.getAnnotation(Description.class)!=null&&p.isEnum()).collect(Collectors.toList());
        var re = list.stream().map(p -> {
            var dictType = new SysDictType();
            dictType.setDictName(p.getAnnotation(Description.class).value());
            dictType.setDictType(type_prefix + p.getSimpleName());
            var data = Arrays.stream(p.getEnumConstants()).map(x -> {
                var dictData = new SysDictData();
                dictData.setDictLabel(((Enum) x).name());
                dictData.setDictValue(((EnumIntValue) x).getValue() + "");
                dictData.setRemark("系统内置创建值，请勿修改："+dictData.getDictLabel()+"="+dictData.getDictValue());
                return dictData;
            }).toArray(SysDictData[]::new);
            return new Pair(dictType, data);
        }).toArray(Pair[]::new);
        return re;
    }
}
